/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hps.model;

import java.io.Serializable;
import java.util.ArrayList;

/**
 * Implementiert einen Einfluss auf FloorFields 
 * 
 * @author $Author: NIKE3500 $
 * @version $Revision: 85 $
 * @date $Date: 2013-01-14 18:59:09 +0000 (Mon, 14 Jan 2013) $
 */
public interface IInfluence extends IDrawable, Serializable{
    
    /**
     * Setzt den Einfluss auf das uebergebene FloorField
     * 
     * @param field Feld, auf dem zu arbeiten ist
     */
    public void setInfluence(FloorField field);
    
    /**
     * Bewirkt Ausbreitung des Einflusses
     * 
     * @return Ausbreitungen des Einflusses
     */
    public ArrayList<IInfluence> spread(IInfluence[][] blocked);
    
    /**
     * Gibt Aufschluss darueber, ob der Einfluss ein bestimmtes Feld blockiert.
     * @return 0 wenn das Feld nicht blockiert ist 
     */
    public int getBlocked(Point p);
    
    /**
     * Liefert eine Liste von Koordinaten, die der Einfluss blockiert
     * @return Liste mit blockierten Feldern.
     */
    public ArrayList<Point> getBlockedFields();
    
    /**
     * Mit dieser Methode laesst sich pruefen, ob der Einfluss ein
     * Feld blockiert.
     * @return true, falls Felder blockiert werden
     */
    public boolean isBlocking();
    
    /**
     * 
     * @param pos zu prüfende Position
     * @return true, falls Influence sich an Position befindet
     */
    public boolean isAt(Point pos);
    
    /**
     * Gibt Kopie des Einflusses zurueck
     * @return Kopie des Einflusses.
     */
    public IInfluence clone();
    
    /**
     * Fuegt den uebergebenen Pedestrians ggf. schaden zu
     * @param pedestrians Personen, die sich in der Simulation befinden.
     */
    public void damage(ArrayList<Pedestrian> pedestrians);
    
}
